package cn.doitedu.df_rdd

import cn.doitedu.util.SparkUtil
import org.apache.spark.sql.{DataFrame, Dataset, Row}

/**
 * @Date 22.4.12
 * @Created by HANGGE
 * @Description
 */
object C01_Demo01 {
  def main(args: Array[String]): Unit = {
    // 获取环境
    val session = SparkUtil.getSession
    import  session.implicits._

    // 创建 DF
    val df1: Dataset[Row] = session.read.option("header", true)
      .option("inferSchema", true)
      .csv("data\\scores\\Scores.csv")

    val df2: DataFrame= session.read.option("header", true)
      .option("inferSchema", true)
      .csv("data\\scores\\Scores.csv")

    // map算子  处理每条数据 DataFrame = RDD+结构  代表的是一个抽象的数据集
    // map算子  处理抽象数据集中的一条数据   Row 行数据的抽象
    // 解析方式 01
    val res: Dataset[(Int, String)] = df2.map(row => { // 每条数据就是Row
      val id = row.getInt(0)
      val name = row.getString(1)
      val age = row.getInt(2)
      val sex = row.getString(3)
      val city = row.getString(4)
      val score = row.getDouble(5)
      (id, name)
    })
    // 解析方式 02
    df2.map(row=>{
      val id = row.getAs[Int]("id")
      val name:String = row.getAs[String]("name")
      val city:String = row.getAs[String]("city")
      val score = row.getAs[Double]("score")
      (id , name , city , score)
    })

    // 解析方式 03
    df2.map({
      case Row(id:Int , name:String ,age:Int , sex:String,city:String ,score:Double) => (name  ,city ,score*10)
    }).show()

     // 处理数据

/*    处理方式  SQL方式
             DSL方式
             RDD方式*/



   // session.close()  // 底层调用的是stop

  }

}
